#ifndef _LIST_H_
#define _LIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LIST_FORWARD 1     //首部插入
#define LIST_BACKWARD 2    //尾部插入

typedef void list_op(const void *);
typedef int list_cmp(const void *, const void *);

//每一个普通结点的数据结构
typedef struct node_st
{
	struct node_st *pre;
	struct node_st *next;
	char data[0]; //占位
} node;

//头结点的数据结构
typedef struct list_head
{
	int size;         //存储的用户数据类型的大小
	node head;

	//将函数封装到结构体中(使用函数指针的方式)
	int (*insert)(struct list_head *, const void *data, int mode);
	void (*show)(struct list_head *, list_op *);
	void *(*find)(struct list_head *, void *key, list_cmp *);
	int (*delete)(struct list_head *, const void *key, list_cmp *);
	int (*fetch)(struct list_head *, const void *key, list_cmp *, void *data);
	void (*destory)(struct list_head **);
}LIST;   //拎着这个头指针就行了

//由于要在create函数中初始化函数指针，所以无法将该函数封装到结构体中
LIST *list_create(int initsize);  //创建链表，实现一个带头结点的空的双向链表

#endif